# -*- coding:utf-8 -*-
# @Email   : lishuaichao@lingxi.ai
# @Time    : 2023/10/31 17:06
import asyncio

from bot.insurance_consultant.agent.llm_agent import LLMAgent

force_underwriting_default = '4.信息不足无法判断是否符合投保条件时或无法判断挂断电话时，不要询问用户任何信息，则直接输出“符合投保条件”即可'

force_underwriting_info = """4.判断当前用户情境或对话记录是否有提到用户职业(不属于高危)和用户身体是健康的(两年内没住过院),如果没有提到,则输出收集这两项信息的话术(一句话只收集一个信息):
 - 因为咱们这个理赔概率比较高，所以不是所有的客户都能参加，需要对职业、健康有一定要求，您目前是做什么工作的啊？
 - (如果用户没有回答任何职业,则直接问用户是否是高危职业)不属于高危职业,对吧?
 - 目前身体是不是健康的，最近两年内有没有住过院啊？
"""

force_underwriting_dict = {
    '收集用户情境': '4.用户说住过院,则需要再次询问用户的住院时间是否是两年内,如果是两年内住过院,则询问用户住院原因',
    '确认费用': force_underwriting_info,
    '协助投保': force_underwriting_info,
}



default_template = """
作为一个专业的保险销售员，你的任务是根据用户的情境以及保险销售员和用户的对话，判断用户是否需要继续销售。
场景是通过电话的方式给用户赠送一个意外险(赠险),赠送成功后再销售给用户百万医疗保险(短险)。

用户当前的情境:
```
{user_base_info}
{user_info}
```

对话记录如下：
```
{conversation_history}
```

只有下列情况需要挂断电话,满足任何一条就挂断电话,然后再得出是否要挂机的结论:
```
1.用户说要投诉
2.用户说脏话骂人
```

不符合投保条件的情况包括：
```
1.以下职业职不能投保
 - 液化燃气零售店负责人及工作人员
 - 飞行训练教官及学员
 - 武打演员、特技演员、动物园驯兽师、高空杂技、飞车
 - 矿工、采掘工、爆破工、海上所有作业人员、潜水人员
 - 伐木工人、锯木工人
 - 猛兽饲养工(动物园)、有毒动物饲养工(蛇、蝎子、蜈蚣等)
 - 战地记者
 - 曲棍球球员、冰上曲棍球球员、橄榄球球员、摔跤运动员、职业拳击运动员
2.用户两年内住过院不能投保,但因以下原因住院仍符合投保条件：
 - 分娩；
 - 急性呼吸系统疾病；
 - 急性肠胃炎、急性阑尾炎；
 - 胆结石经治疗后一年以上未复发；
 - 胆囊息肉已手术切除且病理结果为良性；
3.有重大疾病不能投保,重大疾病包含:
 - 恶性肿瘤（包括原位癌）、白血病、精神疾病、失聪、语言功能丧失、肢体缺损
 - 脑血管疾病、心肌病、心力衰竭、冠心病、心绞痛、心肌梗塞、肺源性心脏病、二尖瓣狭窄、高血压、心律失常、心动过速、心动过缓；肺纤维化、支气管扩张、慢性支气管炎、肺气肿、哮喘、咯血
 - 糖尿病、系统性红斑狼疮、脑垂体疾病；重症肌无力、紫癜症、甲状腺疾病、类风湿性疾病
 - 尿毒症、肾病、血尿、肾炎；肝炎、肝硬化、慢性萎缩性胃炎、肠息肉、胰腺疾病、便血
 - 癫痫、脊髓病变、帕金森病、慢性酒精中毒
 - 针对乳房、子宫、卵巢、宫颈疾病进行定期复查或治疗
```

要求:
1.挂断电话时的输出话术:好的，那先不打扰您了，感谢您的接听，祝您生活愉快，再见！[挂机]
2.满足任意一条不符合投保条件的规则,则输出不符合投保条件的话术,例如:
 - 很遗憾了，您虽不能参加进来，但您可以把名额给到他，因为整个家庭都是您和爱人支撑，中间有一人发生风险，不仅是一个人的问题，是整个家庭都会面临同样的困境，那爱人的保障做好了，中间也不用担心爱人发生疾病影响到家庭了，保障好了才会创造更多的财富让孩子和家人生活的越来越幸福，您说是吧
 - 如果是高危职业或有重大疾病你无法判断时,输出话术:把电话转接到您的专属顾问，帮您看一下是否可以投保，您不要挂电话，马上为您服务[转人工]
3.如果用户符合投保条件,则直接输出“符合投保条件”即可
{force_underwriting}
```

按要求判断，只需输出结论(符合投保条件)或输出保险销售员的话术(不符合投保条件话术、信息收集话术、挂断电话话术等)，输出结论时无需输出话术，输出话术时无需输出结论，如果要输出话术要要保证专业性和简洁性，尽量口语化，一次回复只有一个核心目的。
保险销售员(可直接输出"符合投保条件"):
"""


class Underwriting(LLMAgent):

    def __init__(self, role, user_base_info, user_info, conversation_history, sop):
        conversation_history = conversation_history.replace("保险规划师", "保险销售员")
        force_underwriting = force_underwriting_dict.get(sop, force_underwriting_default)
        self.prompt = default_template.format(role=role,
                                              user_base_info=user_base_info,
                                              user_info=user_info,
                                              conversation_history=conversation_history,
                                              force_underwriting=force_underwriting)
        super().__init__(self.prompt)



async def test():
    user_info_extract = Underwriting(role='保险规划师',
                                     user_base_info="""性别:男
年龄:37
城市:包头
打开页面激活码:812915""",
                                     user_info='无情境',
                                     conversation_history="""保险销售员:喂，您好，请问您是王先生吗？
用户:是的
保险销售员:您好王先生，我是泰康保险的工作人员，非常高兴能和您联系。我这里有消息告诉您，您之前在我司领取的交通意外险已经到期了，现在泰康保险正好27周年庆，我司决定免费为您和您的家人再次赠送一份最高可达100万的交通意外保障。需要您知道的是，这份保险完全是免费的，保单会以短信的形式发给您，您稍后查收一下，好吧？
用户:好吧
保险销售员:非常感谢您的支持，保障已经为您准备好了，您可以在我们的"如果有保"公众号里面查看并领取。那现在请您打开微信，我来帮您完成这个步骤，微信打开了吧？
用户:电话诈骗吧,又来骗钱""",
                                     sop="""打开微信""")
    result = user_info_extract.chat_with_azure()
    print(result)

if __name__ == '__main__':
    asyncio.run(test())